Значения CSIDL, о которых рассказывается в этом разделе, предоставляют последовательный единый способ доступа к физическим путям до необходимых папок, не зависящий от операционной системы. Предпочтительным API является SHGetFolderPath, так как он совместим со всеми версиями Windows. Для получения пути к данным приложения должны вызвать функцию SHGetFolderPath с соответствующим CSIDL, а затем добавить [название компании]\[название продукта]\[версия] к возвращаемому пути. В частности:
Чтобы найти путь к CSIDL _APPDATA:
TCHAR szAppData[MAX_PATH]; … hr = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, szAppData);
При сохранении данных приложения в профиле пользователя, приложения должны использовать в Данных Приложения и Шаблонах ту же самую иерархию, которая используется в реестре:
[Профиль пользователя]\ Данные приложения\ [название компании]\ [название продукта]\ [версия]\ [файл или папка]
Тип данных | CSIDL папки | Местоположение папки |
Для пользователя, с роумингом | CSIDL_APPDATA | [профиль пользователя]\Данные приложения |
Для пользователя, без роуминга | CSIDL_LOCAL_APPDATA | [профиль пользователя]\Локальные настройки\Данные приложения |
Для компьютера (независимо от пользователя и роуминга) | CSIDL_COMMON_APPDATA | Все данные приложения/пользователей |
CSIDL_APPDATA
Так как эта папка является частью Профиля пользователя, она будет перемещаться. Используйте эту папку для хранения всех настроек приложения, определяемых пользователем. Например, если пользователь может указать другой словарь, который будет использоваться в Вашем приложении, его необходимо сохранить в этой папке. В этом случае, если пользователь будет переходить от компьютера к компьютеру, его словарь будет перемещаться вместе с ним. Это также позволяет другим пользователям иметь свои собственные словари.
CSIDL_LOCAL_APPDATA
Эта папка используется для данных приложения, которые не перемещаются. Она является частью профиля пользователя, поэтому в ней хранится информация пользователя. В ней должны храниться данные приложения, которые зависят от компьютера, например, разрешение монитора, указанное пользователем. Эти данные не должны перемещаться, так как разные компьютеры имеют разные мониторы. Кроме того, в эту папку должны помещаться большие блоки данных, которые могут быть легко созданы повторно, чтобы сократить время загрузки, расходуемое при роуминге. Например, Internet Explorer хранит в этой папке кэш загруженных html/gif-страниц; таким образом, эти страницы не могут перемещаться вместе с пользователем. Но небольшие файлы cookie и списки просмотренных ранее страниц хранятся в папке CSIDL_APPDATA, следовательно, их можно перемещать.
CSIDL_COMMON_APPDATA
Эта папка должна использоваться для данных приложения, которые не определяются пользователем. Например, в папке CSIDL_COMMON_APPDATA приложение может хранить словарь для проверки орфографии, базу данных коллекции картинок или файл протокола. Данная информация не перемещается, и она доступна любому пользователю, работающему на этом компьютере. По умолчанию для обычных пользователей (не являющихся администраторами или привилегированными пользователями) эта папка доступна только для чтения. Если необходимо, чтобы обычные пользователи имели права на запись в определенный подкаталог CSIDL_COMMON_APPDATA, то приложение должно явно изменить защиту данного подкаталога во время настройки приложения. Информация об изменении защиты должна быть занесена в Анкету поставщика.
Использование реестра:
Приложения могут также использовать реестр для хранения данных приложения, доступных для чтения/записи, и файлов конфигурации.
Реестр HKCU предназначен для хранения небольших объемов данных (менее 64 Кб) и для настроек политики, которые определяются для каждого пользователя.
Постарайтесь не производить запись в HKLM во время работы, так как по умолчанию обычные пользователи имеют доступ Только для Чтения ко всему дереву HKLM. Кроме того, HKLM не поддерживает функцию роуминга.
Данные большего объема, определяемые файлом, должны находится в папке Данные Приложения. Например, Временный Кеш Интернет в Internet Explorer хранится в профиле пользователя, а не в реестре.
Дополнительные аспекты:
Файлы могут совместно использоваться в UserProfile\Application Data. Они могут использоваться несколькими компьютерами одновременно в различных версиях данного приложения. Данные также могут использоваться несколькими приложениями, например, приложениями одного комплекта программ. При необходимости приложения могут получить исключительное право записи в файл. Например, приложения, использующие CreateFile, должны просто указать GENERIC_WRITE, если потребуется выполнить запись, но в них всегда должно быть задано FILE_SHARE_READ.
Пути, возвращаемые SHGetFolderPath, являются допустимыми именами файловой системы Win32, которые могут содержать пробелы и могут иметь формат UNC.
Функции API PathAppend() и PathCombine() могут использоваться для объединения относительного пути и путей, возвращаемых функцией SHGetFolderPath. Например:
PathAppend(szAppData, "Company\Product\File.txt")")
Любой пользователь может осуществлять запись в каталог Все пользователи\Документы. Однако по умолчанию только создатель документа (и администраторы) смогут в дальнейшем вносить изменения в этот документ. Все остальные пользователи (не являющиеся администраторами) смогут по умолчанию получать к этому документу доступ только для чтения. Если приложению необходимо, чтобы все обычные пользователи могли осуществлять запись в определенный подкаталог папки CSIDL_COMMON_DOCUMENTS данного приложения, то приложение должно явно изменить защиту этого подкаталога во время настройки. Информация об изменении настроек защиты должна быть занесена в Анкету поставщика.
По умолчанию обычные пользователи имеют доступ только для чтения ко всем каталогам, кроме перечисленных в требовании 6. Таким образом, обычные пользователи не могут осуществлять запись в каталог Winnt, system32 или каталог Program Files.